#include <iostream>
#include <signal.h>
#include <unistd.h>
void PrintPending(sigset_t &pending)
{
    for (int i = 31; i >= 1; i--)
    {
        if (sigismember(&pending, i)) // 如果有当前数字对应的编号就打印1，反之0
        {
            std::cout << "1";
        }
        else
        {
            std::cout << "0";
        }
    }
    std::cout << std::endl;
}

void handle(int sig)
{
    std::cout << "递达" << sig << "信号" << std::endl;
    sigset_t pending;
    int m = sigpending(&pending);
    PrintPending(pending);
}
int main()
{
    signal(SIGINT, handle);
    sigset_t block;
    sigset_t old_block;      // 作为sigprocmask的输出型参数
    sigemptyset(&block);     // 清空信号集
    sigemptyset(&old_block); // 清空信号集

    // 1..对二号信号进行屏蔽
    sigaddset(&block, SIGINT); // 把2号信号添加到block里
    int n = sigprocmask(SIG_SETMASK, &block, &old_block);
    (void)n;
    // 加一个循环，不断的获取与打印
    int cnt = 5;
    while (true)
    {

        // 2..获取pending信号集
        sigset_t pending;
        int m = sigpending(&pending); // sigpending 获取pending表，放在pending里

        // 3..打印pending信号集
        PrintPending(pending);
        if (cnt == 0)
        {
            // 恢复对2号信号的block的情况
            sigprocmask(SIG_SETMASK, &old_block, nullptr);
            std::cout << "解除对2号新号的屏蔽" << std::endl;
        }
        sleep(1);
        cnt--;
    }

    return 0;
}